Skill

FastAPI এর সাথে WebSocket এবং Real-Time Communication

Web Development - ফাস্টএপিআই (FastAPI)
305

FastAPI আধুনিক অ্যাপ্লিকেশন ডেভেলপমেন্টে খুবই শক্তিশালী এবং জনপ্রিয় একটি ফ্রেমওয়ার্ক, যা WebSocket এবং Real-Time Communication সমর্থন করে। WebSocket ব্যবহার করে আপনি ক্লায়েন্ট এবং সার্ভারের মধ্যে একদম রিয়েল-টাইমে ডাটা আদান প্রদান করতে পারেন। এটি চ্যাট অ্যাপ্লিকেশন, লাইভ আপডেট, গেমস, এবং অন্যান্য রিয়েল-টাইম ফিচারগুলির জন্য অত্যন্ত উপকারী।

FastAPI WebSocket সমর্থন করে ASGI (Asynchronous Server Gateway Interface) ইন্টারফেসের মাধ্যমে, যা অ্যাসিঙ্ক্রোনাস যোগাযোগকে সহজ করে তোলে।


Step 1: WebSocket সংযোগ তৈরি করা

FastAPI তে WebSocket রাউট তৈরি করতে WebSocket ক্লাস ব্যবহার করতে হয়। নিচে একটি সাধারণ উদাহরণ দেওয়া হলো।

উদাহরণ: WebSocket সংযোগ

from fastapi import FastAPI, WebSocket, WebSocketDisconnect

app = FastAPI()

# WebSocket রাউট
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()  # ক্লায়েন্টের সাথে সংযোগ গ্রহণ করা
    try:
        while True:
            data = await websocket.receive_text()  # ক্লায়েন্ট থেকে ডাটা গ্রহণ
            await websocket.send_text(f"Message received: {data}")  # ক্লায়েন্টকে পাঠানো
    except WebSocketDisconnect:
        print("Client disconnected")

এখানে:

  • /ws: WebSocket এর এন্ডপয়েন্ট।
  • websocket.accept(): ক্লায়েন্টের সাথে সংযোগ গ্রহণ।
  • websocket.receive_text(): ক্লায়েন্ট থেকে পাঠানো ডাটা গ্রহণ।
  • websocket.send_text(): ক্লায়েন্টকে রেসপন্স পাঠানো।

Step 2: WebSocket ক্লায়েন্ট তৈরি করা

WebSocket ক্লায়েন্ট সাধারণত ব্রাউজারের মাধ্যমে তৈরি করা হয়, যেখানে JavaScript ব্যবহার করে সার্ভারের সাথে সংযোগ করা হয়। নিচে একটি সাধারণ JavaScript ক্লায়েন্ট উদাহরণ দেওয়া হলো:

উদাহরণ: JavaScript WebSocket ক্লায়েন্ট

<!DOCTYPE html>
<html>
<head>
    <title>WebSocket Chat</title>
</head>
<body>
    <h2>WebSocket Communication</h2>
    <input type="text" id="message_input" placeholder="Type a message" />
    <button onclick="sendMessage()">Send</button>

    <p id="response"></p>

    <script>
        const ws = new WebSocket("ws://127.0.0.1:8000/ws");

        ws.onopen = () => {
            console.log("Connected to WebSocket server");
        };

        ws.onmessage = (event) => {
            document.getElementById("response").textContent = event.data;
        };

        function sendMessage() {
            const message = document.getElementById("message_input").value;
            ws.send(message);
        }
    </script>
</body>
</html>

এখানে:

  • ws.onopen: WebSocket সার্ভারের সাথে সংযোগ স্থাপন হলে কলব্যাক।
  • ws.onmessage: সার্ভার থেকে প্রাপ্ত বার্তা দেখানো হবে।
  • ws.send: সার্ভারে ডাটা পাঠানো।

Step 3: Multiple Clients এর সাথে Communication

FastAPI তে আপনি একাধিক ক্লায়েন্টের সাথে যোগাযোগ পরিচালনা করতে পারেন। প্রতিটি ক্লায়েন্টের জন্য একটি আলাদা সংযোগ পরিচালনা করা হয়।

উদাহরণ: Multiple WebSocket Clients

from fastapi import FastAPI, WebSocket, WebSocketDisconnect

app = FastAPI()
active_connections = []

@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()
    active_connections.append(websocket)
    try:
        while True:
            data = await websocket.receive_text()
            for connection in active_connections:
                if connection != websocket:
                    await connection.send_text(f"Message from another client: {data}")
    except WebSocketDisconnect:
        active_connections.remove(websocket)
        print("Client disconnected")

এখানে:

  • active_connections: একটি তালিকা, যাতে সমস্ত সক্রিয় WebSocket সংযোগ রাখা হয়।
  • for connection in active_connections: একাধিক ক্লায়েন্টকে ডাটা পাঠানো হয়, তবে যেই ক্লায়েন্ট পাঠাচ্ছে, তাকে বাদ দিয়ে বাকি সব ক্লায়েন্টকে রেসপন্স পাঠানো হয়।

Step 4: WebSocket Error Handling

WebSocket সংযোগের সময় কখনও কখনও ত্রুটি হতে পারে, যেমন ক্লায়েন্টের সংযোগ বিচ্ছিন্ন হওয়া, ইন্টারনেট সমস্যা, বা অন্য কোন ত্রুটি। FastAPI তে আমরা WebSocketDisconnect ক্লাস ব্যবহার করে এই ত্রুটিগুলি হ্যান্ডল করতে পারি।

উদাহরণ: WebSocket Error Handling

from fastapi import FastAPI, WebSocket, WebSocketDisconnect

app = FastAPI()

@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()
    try:
        while True:
            data = await websocket.receive_text()
            await websocket.send_text(f"Message received: {data}")
    except WebSocketDisconnect:
        print("Client disconnected")
        await websocket.send_text("You have been disconnected.")

এখানে, WebSocketDisconnect ব্যতিক্রম হ্যান্ডল করার মাধ্যমে, ক্লায়েন্ট বিচ্ছিন্ন হলে একটি মেসেজ পাঠানো হয়।


Step 5: Broadcasting Messages to Multiple Clients

FastAPI তে WebSocket এর মাধ্যমে একাধিক ক্লায়েন্টকে একটি মেসেজ ব্রডকাস্ট করা যায়।

উদাহরণ: Broadcasting Messages

from fastapi import FastAPI, WebSocket, WebSocketDisconnect

app = FastAPI()
active_connections = []

@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()
    active_connections.append(websocket)
    try:
        while True:
            data = await websocket.receive_text()
            # Broadcast message to all active clients
            for connection in active_connections:
                if connection != websocket:
                    await connection.send_text(f"Message from another client: {data}")
    except WebSocketDisconnect:
        active_connections.remove(websocket)
        print("Client disconnected")

এখানে, active_connections লিস্টের মাধ্যমে সমস্ত সক্রিয় ক্লায়েন্টদের মেসেজ ব্রডকাস্ট করা হয়।


Step 6: Real-Time Communication Use Cases

FastAPI WebSocket খুবই কার্যকরী রিয়েল-টাইম অ্যাপ্লিকেশন তৈরি করতে:

  1. চ্যাট অ্যাপ্লিকেশন: একাধিক ক্লায়েন্টের মধ্যে বার্তা আদান প্রদান।
  2. লাইভ আপডেট: যেমন স্টক মার্কেট বা স্পোর্টস সাইটে লাইভ স্কোর।
  3. গেম ডেভেলপমেন্ট: রিয়েল-টাইম গেমের তথ্য এবং স্কোর আপডেট।

FastAPI তে WebSocket এবং Real-Time Communication খুব সহজে ইমপ্লিমেন্ট করা যায়। FastAPI-এর ASGI সমর্থনের মাধ্যমে আপনি সহজেই অ্যাসিঙ্ক্রোনাস এবং রিয়েল-টাইম অ্যাপ্লিকেশন তৈরি করতে পারেন। এর মাধ্যমে ব্যাকগ্রাউন্ড টাস্ক, ক্লায়েন্ট-ক্লায়েন্ট ইন্টারঅ্যাকশন, এবং লাইভ আপডেট করা সম্ভব।

Content added By

WebSocket কী এবং কেন প্রয়োজন?

205

WebSocket হল একটি প্রোটোকল যা ক্লায়েন্ট এবং সার্ভারের মধ্যে দুইমুখী যোগাযোগ (two-way communication) স্থাপন করতে ব্যবহৃত হয়। এটি HTTP প্রোটোকলের উপর ভিত্তি করে কাজ করে, তবে HTTP-এর তুলনায় এটি অনেক বেশি কার্যকর যখন real-time, ইনস্ট্যান্ট ডাটা ট্রান্সফার প্রয়োজন। FastAPI WebSocket ব্যবহার করে real-time অ্যাপ্লিকেশন তৈরি করতে সহায়ক।


WebSocket কী?

WebSocket একটি যোগাযোগ প্রোটোকল যা ক্লায়েন্ট (যেমন ব্রাউজার) এবং সার্ভারের মধ্যে স্টেটফুল (stateful) এবং পূর্ণ দ্বিমুখী (full-duplex) চ্যানেল তৈরি করে। WebSocket ব্যবহার করে, ক্লায়েন্ট এবং সার্ভার একে অপরের সাথে ইন্টারঅ্যাক্ট করতে পারে এবং ডাটা পাঠাতে ও গ্রহণ করতে পারে যখনই প্রয়োজন।

WebSocket-এর বৈশিষ্ট্য:

  • দ্বিমুখী যোগাযোগ: সার্ভার এবং ক্লায়েন্ট একে অপরের সঙ্গে সমান্তরালভাবে ডাটা পাঠাতে এবং গ্রহণ করতে পারে।
  • স্টেটফুল যোগাযোগ: একবার কানেকশন প্রতিষ্ঠিত হলে, এটি স্থায়ী থাকে, এবং ডাটা প্রেরণ বা গ্রহণ করতে কোনো অতিরিক্ত কানেকশন খোলার প্রয়োজন হয় না।
  • নিরবচ্ছিন্ন যোগাযোগ: দীর্ঘ সময় ধরে একযোগভাবে ডাটা ট্রান্সফার করার জন্য WebSocket আদর্শ।

WebSocket কেন প্রয়োজন?

WebSocket বেশ কিছু সুনির্দিষ্ট পরিস্থিতিতে HTTP এর চেয়ে বেশি কার্যকর, বিশেষ করে যখন real-time ডাটা ট্রান্সফার দরকার।

১. Real-time Communication (ইনস্ট্যান্ট আপডেট)

HTTP প্রোটোকল রিকোয়েস্ট/রেসপন্স ভিত্তিক, যার মানে হল যে ক্লায়েন্ট সার্ভারের কাছে একটি রিকোয়েস্ট পাঠায় এবং তারপরে সার্ভার রেসপন্স পাঠায়। কিন্তু, WebSocketের মাধ্যমে ক্লায়েন্ট এবং সার্ভার অবিচ্ছিন্নভাবে যোগাযোগ করতে পারে। উদাহরণস্বরূপ:

  • চ্যাট অ্যাপ্লিকেশন: একাধিক ব্যবহারকারীকে ইনস্ট্যান্ট মেসেজিং সিস্টেমে জড়িত রাখতে WebSocket প্রয়োজন।
  • লাইভ আপডেট: যেমন, stock prices, sports scores বা news feed যেখানে ডাটা প্রতি সেকেন্ডে আপডেট হতে থাকে।

২. সর্বনিম্ন ল্যাটেন্সি (Low Latency)

WebSocket সেশন শুরু হওয়ার পরে, সার্ভার এবং ক্লায়েন্টের মধ্যে ডাটা একে অপরকে শেয়ার করার সময় বিলম্ব খুব কম থাকে। HTTP ব্যবহার করলে বারবার রিকোয়েস্ট/রেসপন্স প্রক্রিয়া ঘটাতে হয়, যা সময় নষ্ট করে।

৩. কম রিসোর্স খরচ (Less Overhead)

HTTP প্রতিটি রিকোয়েস্টের সাথে হেডার এবং মেটাডেটা প্রেরণ করে, যা প্রতি রিকোয়েস্টের জন্য অতিরিক্ত লোড তৈরি করে। WebSocketের ক্ষেত্রে একবার কানেকশন হয়ে গেলে, পরবর্তী সব বার্তা কেবল ডাটা হিসেবে প্রেরিত হয়, ফলে এটি অনেক কম রিসোর্স ব্যবহার করে।

৪. হ্যান্ডশেক ছাড়াই চলমান যোগাযোগ

HTTP-এর জন্য বারবার কানেকশন হ্যান্ডশেক করতে হয়, কিন্তু WebSocketের মধ্যে একবার কানেকশন স্থাপন হলে সেটি চালু থাকে, তাই এটি প্রক্রিয়াকে দ্রুত এবং আরও দক্ষ করে তোলে।


FastAPI তে WebSocket ব্যবহার

FastAPI তে WebSocket ব্যবহার করা খুবই সহজ। FastAPI এ WebSocket ক্লাস রয়েছে, যা আপনি WebSocket কানেকশন তৈরি করতে ব্যবহার করতে পারেন।

উদাহরণ: FastAPI WebSocket অ্যাপ্লিকেশন

from fastapi import FastAPI, WebSocket

app = FastAPI()

@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()
    while True:
        data = await websocket.receive_text()
        await websocket.send_text(f"Message received: {data}")

এখানে:

  • @app.websocket("/ws"): এই ডেকোরেটরটি WebSocket এন্ডপয়েন্ট তৈরি করে।
  • websocket.accept(): WebSocket কানেকশন গ্রহণ করা হয়।
  • websocket.receive_text(): ক্লায়েন্ট থেকে ডাটা গ্রহণ করা হয়।
  • websocket.send_text(): ক্লায়েন্টকে রেসপন্স পাঠানো হয়।

WebSocket ক্লায়েন্ট উদাহরণ (JavaScript):

let socket = new WebSocket("ws://localhost:8000/ws");

socket.onopen = function(event) {
    socket.send("Hello, FastAPI!");
};

socket.onmessage = function(event) {
    console.log("Message from server: ", event.data);
};

এখানে, JavaScript দিয়ে WebSocket কানেকশন তৈরি করা হয়েছে এবং FastAPI সার্ভারের সঙ্গে যোগাযোগ স্থাপন করা হয়েছে।

রিকোয়েস্ট/রেসপন্স:

  • ক্লায়েন্ট: "Hello, FastAPI!"
  • FastAPI সার্ভার: "Message received: Hello, FastAPI!"

FastAPI WebSocket-এ Asynchronous Programming

FastAPI তে async এবং await ব্যবহার করা হয় যাতে WebSocketের মাধ্যমে asynchronous কমিউনিকেশন করা যায়। এটি WebSocket এর মাধ্যমে ইনস্ট্যান্ট ডাটা প্রক্রিয়া করতে সহায়ক।

উদাহরণ: Asynchronous WebSocket

from fastapi import FastAPI, WebSocket
import asyncio

app = FastAPI()

@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()
    while True:
        data = await websocket.receive_text()
        await asyncio.sleep(1)  # simulate some processing delay
        await websocket.send_text(f"Processed message: {data}")

এখানে, asyncio.sleep(1) ব্যবহার করা হয়েছে, যা WebSocketের মাধ্যমে কিছুটা লেটেন্সি বা প্রসেসিং ডিলে তৈরি করতে পারে এবং তা সঠিকভাবে Asynchronous পদ্ধতিতে কাজ করে।


WebSocket হল একটি শক্তিশালী প্রোটোকল যা FastAPI তে real-time যোগাযোগের জন্য ব্যবহৃত হয়। এটি সার্ভার এবং ক্লায়েন্টের মধ্যে একযোগভাবে দুইমুখী যোগাযোগ স্থাপন করতে সক্ষম, যা লাইভ আপডেট, চ্যাট অ্যাপ্লিকেশন, গেম, এবং অন্য অনেক ধরনের অ্যাপ্লিকেশন তৈরিতে অপরিহার্য। FastAPI তে WebSocket ব্যবহার করে আপনি দ্রুত এবং কার্যকর real-time অ্যাপ্লিকেশন তৈরি করতে পারেন।

Content added By

WebSocket এন্ডপয়েন্ট তৈরি করা

198

WebSockets হল একটি প্রোটোকল যা ক্লায়েন্ট এবং সার্ভারের মধ্যে দ্বিমুখী যোগাযোগ (bidirectional communication) প্রতিষ্ঠা করতে সক্ষম। WebSocket একটি স্থায়ী কানেকশন বজায় রেখে কমপ্লেক্স রিয়েল-টাইম অ্যাপ্লিকেশন তৈরি করতে সহায়ক, যেমন চ্যাট অ্যাপ্লিকেশন, লাইভ স্কোর, রিয়েল-টাইম ডাটা ফিড ইত্যাদি।

FastAPI তে WebSocket এন্ডপয়েন্ট তৈরি করা খুবই সহজ এবং সরল। FastAPI WebSockets-এর জন্য websockets লাইব্রেরি ব্যবহার করে এবং এতে async ফাংশন ব্যবহার করা হয়।

এই গাইডে, আমরা একটি সাধারণ WebSocket এন্ডপয়েন্ট তৈরি করব যা FastAPI-তে কাজ করবে।


Step 1: FastAPI এবং WebSockets সেটআপ

FastAPI WebSockets সাপোর্ট করার জন্য আপনার সিস্টেমে websockets লাইব্রেরি ইনস্টল করা প্রয়োজন।

pip install fastapi websockets uvicorn

Step 2: WebSocket এন্ডপয়েন্ট তৈরি

এখন আমরা একটি WebSocket এন্ডপয়েন্ট তৈরি করব যেখানে ক্লায়েন্ট সার্ভারের সাথে সংযোগ করবে এবং সার্ভার থেকে মেসেজ গ্রহণ করবে।

উদাহরণ: WebSocket এন্ডপয়েন্ট

from fastapi import FastAPI, WebSocket, WebSocketDisconnect

app = FastAPI()

@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()  # ক্লায়েন্টের সাথে কানেকশন গ্রহণ
    try:
        while True:
            data = await websocket.receive_text()  # ক্লায়েন্ট থেকে মেসেজ গ্রহণ
            await websocket.send_text(f"Message received: {data}")  # মেসেজের রেসপন্স পাঠানো
    except WebSocketDisconnect:
        print("Client disconnected")

এখানে, /ws হলো WebSocket এন্ডপয়েন্ট:

  • websocket.accept(): এটি ক্লায়েন্টের কানেকশন গ্রহণ করে।
  • await websocket.receive_text(): এটি ক্লায়েন্ট থেকে টেক্সট মেসেজ গ্রহণ করে।
  • await websocket.send_text(): এটি সার্ভার থেকে ক্লায়েন্টকে রেসপন্স পাঠায়।

WebSocket Connection-এর সময় ব্যবহৃত স্টেপ:

  1. ক্লায়েন্ট /ws এন্ডপয়েন্টে কানেক্ট হবে।
  2. সার্ভার ক্লায়েন্টকে একটি স্বীকৃতি পাঠাবে।
  3. ক্লায়েন্ট সার্ভারে মেসেজ পাঠাবে এবং সার্ভার তা রেসপন্স করবে।

Step 3: WebSocket কানেকশন টেস্ট করা

WebSocket এন্ডপয়েন্ট তৈরি করার পর, আপনি WebSocket client (যেমন ব্রাউজারের কনসোল বা অন্য কোন WebSocket ক্লায়েন্ট) দিয়ে পরীক্ষা করতে পারেন।

উদাহরণ: ব্রাউজার কনসোল ব্যবহার করে WebSocket কানেকশন

  1. প্রথমে আপনার FastAPI অ্যাপ চালু করুন:

    uvicorn app:app --reload
    
  2. এখন, Chrome DevTools Console (বা অন্য ব্রাউজার) খুলুন এবং WebSocket কানেকশন তৈরি করতে নিম্নলিখিত কোডটি ব্যবহার করুন:
let socket = new WebSocket("ws://127.0.0.1:8000/ws");

socket.onopen = function(event) {
    console.log("WebSocket is connected");
    socket.send("Hello Server!");  // সার্ভারে মেসেজ পাঠান
};

socket.onmessage = function(event) {
    console.log("Message from server:", event.data);  // সার্ভারের রেসপন্স দেখুন
};

socket.onclose = function(event) {
    console.log("WebSocket is closed");
};

এখানে:

  • socket.send("Hello Server!"): ক্লায়েন্ট সার্ভারে একটি মেসেজ পাঠায়।
  • socket.onmessage: এটি সার্ভারের রেসপন্স গ্রহণ করে এবং কনসোলে প্রদর্শন করে।

সার্ভার রেসপন্স:

ক্লায়েন্ট যদি "Hello Server!" মেসেজ পাঠায়, তবে সার্ভার "Message received: Hello Server!" রেসপন্স পাঠাবে।


Step 4: WebSocket Disconnect Handling

WebSocket কানেকশন কখনো বন্ধ হতে পারে, যেমন যখন ক্লায়েন্ট কানেকশন বন্ধ করে দেয় বা নেটওয়ার্কে সমস্যা হয়। FastAPI তে WebSocketDisconnect এক্সসেপশন হ্যান্ডলিং ব্যবহার করে এই অবস্থাটি ম্যানেজ করা যায়।

উদাহরণ: WebSocket Disconnect Handling

from fastapi import FastAPI, WebSocket, WebSocketDisconnect

app = FastAPI()

@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()
    try:
        while True:
            data = await websocket.receive_text()
            await websocket.send_text(f"Message received: {data}")
    except WebSocketDisconnect:
        print("Client disconnected")
        await websocket.close()  # ক্লায়েন্ট ডিসকানেক্ট হলে সংযোগ বন্ধ করা

এখানে:

  • WebSocketDisconnect: এটি ধরা হয় যখন ক্লায়েন্ট সংযোগ বিচ্ছিন্ন করে।
  • await websocket.close(): এটি ক্লায়েন্ট ডিসকানেক্ট হলে WebSocket বন্ধ করে দেয়।

Step 5: Testing the WebSocket Connection

WebSocket এর কাজ পরীক্ষা করতে একটি WebSocket Client ব্যবহার করতে পারেন, যেমন:

  • Postman: WebSocket ক্লায়েন্ট সাপোর্ট করে, যেখানে আপনি WebSocket URL (যেমন ws://127.0.0.1:8000/ws) দিয়ে সংযোগ পরীক্ষা করতে পারেন।
  • websocat: একটি কমান্ড লাইন WebSocket ক্লায়েন্ট যা WebSocket সেশনগুলি টেস্ট করতে সাহায্য করে।

উদাহরণ websocat ব্যবহার:

websocat ws://127.0.0.1:8000/ws

এটি আপনাকে WebSocket সার্ভারের সাথে সংযুক্ত করবে এবং আপনি মেসেজ পাঠাতে পারবেন।


FastAPI তে WebSocket এন্ডপয়েন্ট তৈরি করা খুবই সহজ। WebSocket ব্যবহার করে আপনি একে অপরের সাথে রিয়েল-টাইম তথ্য আদান-প্রদান করতে পারেন। FastAPI এর async এবং await ফিচারের সাহায্যে WebSocket সেশনগুলির সাথে অ্যাসিঙ্ক্রোনাসলি কাজ করা সম্ভব, যা আপনার অ্যাপ্লিকেশনকে আরও দ্রুত এবং স্কেলেবল করে তোলে। WebSocket ব্যবহার করে আপনি রিয়েল-টাইম চ্যাট অ্যাপ্লিকেশন, লাইভ আপডেট এবং অন্যান্য রিয়েল-টাইম ফিচার তৈরি করতে পারবেন।

Content added By

Real-time Communication এবং Data Streaming

195

FastAPI অত্যন্ত দ্রুত এবং কার্যকরী ওয়েব অ্যাপ্লিকেশন তৈরি করার জন্য ব্যবহৃত হয়, এবং এটি Real-time Communication এবং Data Streaming এর জন্য আধুনিক প্রযুক্তি সমর্থন করে। এখানে, আমরা জানবো কিভাবে FastAPI তে WebSockets এবং Server-Sent Events (SSE) ব্যবহার করে রিয়েল-টাইম কমিউনিকেশন এবং ডাটা স্ট্রিমিং করা যায়।


Real-time Communication

Real-time communication বা লাইভ ডাটা ট্রান্সফার হল এমন একটি প্রক্রিয়া, যার মাধ্যমে সিস্টেমের মধ্যে ডাটা তাত্ক্ষণিকভাবে প্রেরণ করা হয়। FastAPI তে, দুটি জনপ্রিয় প্রযুক্তি ব্যবহার করে রিয়েল-টাইম কমিউনিকেশন করা যায়:

  1. WebSockets
  2. Server-Sent Events (SSE)

WebSockets

WebSocket হল একটি প্রোটোকল যা ক্লায়েন্ট এবং সার্ভারের মধ্যে পূর্ণ-দ্বিমুখী যোগাযোগ স্থাপন করে। এটি HTTP প্রোটোকলের উপর ভিত্তি করে তৈরি, তবে HTTP হ্যান্ডশেক শেষ হওয়ার পর এটি একটি পূর্ণ-দ্বিমুখী (Full-duplex) যোগাযোগ চ্যানেল খুলে দেয়। এর মাধ্যমে সার্ভার এবং ক্লায়েন্টের মধ্যে দ্রুত এবং স্বয়ংক্রিয়ভাবে ডাটা প্রেরণ করা যায়।

WebSocket উদাহরণ FastAPI তে

from fastapi import FastAPI, WebSocket, WebSocketDisconnect

app = FastAPI()

# WebSocket endpoint
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()
    try:
        while True:
            # Receive message from client
            data = await websocket.receive_text()
            print(f"Message received: {data}")
            # Send message to client
            await websocket.send_text(f"Message received: {data}")
    except WebSocketDisconnect:
        print("Client disconnected")

ব্যাখ্যা:

  • @app.websocket("/ws"): এটি একটি WebSocket এন্ডপয়েন্ট তৈরি করছে, যেখানে ক্লায়েন্টরা কানেক্ট করতে পারবে।
  • await websocket.accept(): WebSocket কানেকশনের শুরুতে সার্ভার ক্লায়েন্টের সাথে সংযোগ গ্রহণ করে।
  • await websocket.receive_text(): সার্ভার ক্লায়েন্ট থেকে টেক্সট মেসেজ গ্রহণ করে।
  • await websocket.send_text(): সার্ভার ক্লায়েন্টকে একটি টেক্সট মেসেজ প্রেরণ করে।
  • WebSocketDisconnect: ক্লায়েন্ট যদি সংযোগ বিচ্ছিন্ন করে, তাহলে WebSocketDisconnect এর মাধ্যমে সেশন বন্ধ হয়ে যাবে।

রিকোয়েস্ট উদাহরণ:

WebSocket ক্লায়েন্ট হতে পারে:

const socket = new WebSocket("ws://127.0.0.1:8000/ws");

socket.onopen = function(event) {
    console.log("Connection established");
    socket.send("Hello Server!");
};

socket.onmessage = function(event) {
    console.log("Message from server: " + event.data);
};

এখানে, ক্লায়েন্ট সার্ভারের সাথে কানেক্ট হবে, এবং Hello Server! বার্তা সার্ভারে পাঠাবে। সার্ভারও এর উত্তরে বার্তা ফেরত পাঠাবে।


Server-Sent Events (SSE)

Server-Sent Events (SSE) হল একটি একমুখী (one-way) যোগাযোগ পদ্ধতি, যেখানে শুধুমাত্র সার্ভার থেকে ক্লায়েন্টে ডাটা প্রেরণ করা হয়। এটি সাধারণত লগ, এলার্ট বা লাইভ ডাটা স্ট্রিমিং এর জন্য ব্যবহৃত হয়, যেখানে ক্লায়েন্ট বারবার সার্ভারে রিকোয়েস্ট না করে ধারাবাহিকভাবে ডাটা পেতে পারে।

SSE উদাহরণ FastAPI তে

from fastapi import FastAPI
from fastapi.responses import EventSourceResponse
import time

app = FastAPI()

# SSE endpoint
@app.get("/events/")
async def event_stream():
    async def event_publisher():
        while True:
            time.sleep(1)  # Simulate data streaming
            yield f"data: The current time is {time.ctime()}\n\n"
    return EventSourceResponse(event_publisher())

ব্যাখ্যা:

  • EventSourceResponse: FastAPI এর মাধ্যমে SSE রেসপন্স তৈরী করতে এটি ব্যবহার করা হয়।
  • event_publisher: এটি একটি অ্যাসিঙ্ক্রোনাস ফাংশন যা ধারাবাহিকভাবে ডাটা প্রেরণ করে। এখানে, প্রতি ১ সেকেন্ড পর time.ctime() দ্বারা সার্ভার বর্তমান সময় পাঠাচ্ছে।

রিকোয়েস্ট উদাহরণ:

এটি একটি SSE ক্লায়েন্ট হতে পারে:

const eventSource = new EventSource("http://127.0.0.1:8000/events/");

eventSource.onmessage = function(event) {
    console.log("New message from server: " + event.data);
};

এখানে, ক্লায়েন্ট সার্ভারের সাথে সংযোগ স্থাপন করবে এবং প্রতি সেকেন্ডে নতুন তথ্য (বর্তমান সময়) পাবে।


WebSockets এবং SSE এর মধ্যে পার্থক্য

বৈশিষ্ট্যWebSocketsServer-Sent Events (SSE)
কমিউনিকেশনদ্বিমুখী (Full-duplex)একমুখী (One-way)
ক্লায়েন্ট এবং সার্ভারউভয়ের মধ্যে মেসেজ আদান-প্রদানশুধুমাত্র সার্ভার থেকে ক্লায়েন্টে
ট্রান্সপোর্টTCP-based (WS)HTTP-based (SSE)
ব্যবহাররিয়েল-টাইম চ্যাট, গেম, কোল্যাবোরেশনলাইভ ডাটা স্ট্রিমিং, এলার্টস
পারফরম্যান্সউচ্চ পারফরম্যান্স, দুই-way কমিউনিকেশনসহজ এবং ক্লায়েন্ট-ফ্রেন্ডলি

Data Streaming

FastAPI তে Data Streaming পরিচালনা করতে, আমরা মূলত SSE বা WebSockets ব্যবহার করি, যেগুলো আমাদের স্ট্রিমিং ডাটা রিয়েল-টাইমে ক্লায়েন্টে পাঠাতে সক্ষম। এর মাধ্যমে, বড় ডাটা ফাইল বা টেকনিক্যাল কমিউনিকেশন দ্রুত এবং কার্যকরীভাবে সম্পাদন করা যায়।

Data Streaming উদাহরণ:

from fastapi import FastAPI
from fastapi.responses import StreamingResponse
import io

app = FastAPI()

# File streaming
@app.get("/file/")
async def stream_file():
    file_content = b"Some large content..." * 1000  # Simulate large file content
    return StreamingResponse(io.BytesIO(file_content), media_type="application/octet-stream")

এখানে, StreamingResponse ব্যবহার করে একটি বড় ফাইল বা ডাটা স্ট্রিম ক্লায়েন্টে পাঠানো হচ্ছে। এটি খুবই কার্যকরী যখন আপনার কাছে বড় ফাইল বা ডাটা স্ট্রিমিং থাকে, যেমন ভিডিও স্ট্রিমিং বা বড় ডকুমেন্ট আপলোড/ডাউনলোড।


FastAPI তে Real-time Communication এবং Data Streaming সহজেই পরিচালনা করা যায় WebSockets এবং Server-Sent Events ব্যবহার করে। WebSockets দ্বিমুখী কমিউনিকেশন (full-duplex communication) এবং SSE একমুখী (one-way) স্ট্রিমিং ডাটা সেবা প্রদান করে। FastAPI এই প্রযুক্তিগুলো ব্যবহার করে দ্রুত, স্কেলেবল, এবং অত্যন্ত কার্যকরী রিয়েল-টাইম অ্যাপ্লিকেশন তৈরি করতে সহায়ক।

Content added By

WebSocket এর মাধ্যমে Chat Application তৈরি করা

203

FastAPI তে WebSocket ব্যবহার করে একটি রিয়েল-টাইম চ্যাট অ্যাপ্লিকেশন তৈরি করা সহজ। WebSocket হল একটি প্রোটোকল যা ক্লায়েন্ট এবং সার্ভারের মধ্যে দীর্ঘস্থায়ী কানেকশন তৈরি করে, যাতে ডেটা একযোগে পাঠানো এবং গ্রহণ করা সম্ভব হয়। এটি সাধারণ HTTP রিকোয়েস্ট/রেসপন্স পদ্ধতির তুলনায় অনেক দ্রুত এবং কার্যকরী, বিশেষ করে রিয়েল-টাইম অ্যাপ্লিকেশন যেমন চ্যাট সিস্টেমের জন্য।

এখানে আমরা দেখব কিভাবে FastAPI এবং WebSocket ব্যবহার করে একটি সাধারণ চ্যাট অ্যাপ্লিকেশন তৈরি করা যায়।


Step 1: FastAPI অ্যাপ তৈরি করা এবং WebSocket ইমপ্লিমেন্ট করা

প্রথমে FastAPI এবং WebSocket ইমপ্লিমেন্টেশন সেটআপ করা হবে।

WebSocket হ্যান্ডলার তৈরি করা

FastAPI তে WebSocket কানেকশন হ্যান্ডল করার জন্য WebSocket ক্লাস ব্যবহার করা হয়। এই ক্লাসের মাধ্যমে আপনি ক্লায়েন্টের সাথে একযোগে ডেটা আদান-প্রদান করতে পারবেন।

from fastapi import FastAPI, WebSocket, WebSocketDisconnect

app = FastAPI()

# WebSocket কানেকশন হ্যান্ডল করা
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()  # কানেকশন গ্রহণ
    try:
        while True:
            # ক্লায়েন্ট থেকে মেসেজ গ্রহণ করা
            message = await websocket.receive_text()
            # ক্লায়েন্টকে মেসেজ পাঠানো
            await websocket.send_text(f"You wrote: {message}")
    except WebSocketDisconnect:
        print("Client disconnected")

এখানে:

  • /ws: WebSocket এর জন্য URL রুট।
  • await websocket.accept(): WebSocket কানেকশন গ্রহণ করা।
  • await websocket.receive_text(): ক্লায়েন্ট থেকে পাঠানো মেসেজ গ্রহণ করা।
  • await websocket.send_text(): ক্লায়েন্টকে মেসেজ পাঠানো।

WebSocket কানেকশন স্থাপন

এখন, FastAPI তে একটি WebSocket হ্যান্ডলার তৈরি করা হয়েছে যা ক্লায়েন্টের কাছ থেকে মেসেজ গ্রহণ করে এবং সেগুলি পুনরায় পাঠিয়ে দেয়।


Step 2: WebSocket Chat Application with Multiple Clients

একাধিক ক্লায়েন্টের মধ্যে চ্যাটিং সিস্টেম তৈরি করতে হলে, আমাদের connection management করতে হবে। FastAPI তে WebSocket কানেকশনগুলো ট্র্যাক করতে একটি তালিকা (list) ব্যবহার করা যেতে পারে।

Multiple Clients WebSocket Chat

from fastapi import FastAPI, WebSocket, WebSocketDisconnect

app = FastAPI()

# Active WebSocket clients ট্র্যাক করা
clients = []

@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    # WebSocket কানেকশন গ্রহণ
    await websocket.accept()
    clients.append(websocket)
    try:
        while True:
            # ক্লায়েন্ট থেকে মেসেজ গ্রহণ করা
            message = await websocket.receive_text()
            # সক্রিয় সব ক্লায়েন্টকে মেসেজ পাঠানো
            for client in clients:
                if client != websocket:
                    await client.send_text(f"New message: {message}")
    except WebSocketDisconnect:
        clients.remove(websocket)
        print("Client disconnected")

এখানে:

  • clients: সক্রিয় WebSocket ক্লায়েন্টদের একটি তালিকা, যেখানে সব ক্লায়েন্টের WebSocket অবজেক্ট রাখা হবে।
  • await client.send_text(): প্রতিটি ক্লায়েন্টকে মেসেজ পাঠানো হয়, যা অন্যান্য ক্লায়েন্টের কাছে পৌঁছাবে।
  • WebSocketDisconnect: ক্লায়েন্ট ডিসকানেক্ট হলে তা হ্যান্ডল করা হয়।

Step 3: Frontend (HTML + JavaScript) তৈরি করা

এখন, একটি HTML ফাইল তৈরি করে আমরা ক্লায়েন্ট সাইড থেকে WebSocket কানেকশন তৈরি করব এবং মেসেজ পাঠাবো।

HTML + JavaScript (Frontend)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>WebSocket Chat</title>
</head>
<body>
    <h1>Chat Room</h1>
    <div id="messages"></div>
    <input type="text" id="message_input" placeholder="Type a message...">
    <button onclick="sendMessage()">Send</button>

    <script>
        // WebSocket কানেকশন তৈরি করা
        const socket = new WebSocket("ws://localhost:8000/ws");

        // মেসেজ রিসিভ করা
        socket.onmessage = function(event) {
            const messageDiv = document.getElementById("messages");
            const message = event.data;
            messageDiv.innerHTML += `<p>${message}</p>`;
        };

        // মেসেজ পাঠানো
        function sendMessage() {
            const messageInput = document.getElementById("message_input");
            const message = messageInput.value;
            socket.send(message);  // WebSocket সার্ভারে মেসেজ পাঠানো
            messageInput.value = '';  // ইনপুট ফিল্ড পরিষ্কার করা
        }
    </script>
</body>
</html>

এখানে:

  • WebSocket("ws://localhost:8000/ws"): FastAPI সার্ভারের WebSocket URL-এর মাধ্যমে কানেকশন স্থাপন।
  • socket.onmessage: WebSocket থেকে মেসেজ গ্রহণ এবং HTML ডকুমেন্টে তা দেখানো।
  • socket.send(): মেসেজ সার্ভারে পাঠানোর জন্য ব্যবহার করা হয়।

Step 4: Run the FastAPI Application

এখন FastAPI অ্যাপ্লিকেশনটি চালু করার জন্য Uvicorn ব্যবহার করতে হবে।

uvicorn main:app --reload

এটি আপনার FastAPI অ্যাপ্লিকেশন localhost:8000 তে চালু করবে।


Step 5: Test the Chat Application

  1. আপনার ব্রাউজারে index.html ফাইলটি খুলুন।
  2. একটি মেসেজ টাইপ করুন এবং "Send" বাটনে ক্লিক করুন।
  3. আরও একটি ব্রাউজার উইন্ডো খুলে একই পেজটি রিফ্রেশ করুন এবং দেখুন যে আপনি real-time মেসেজটি অন্য ক্লায়েন্টের কাছে দেখতে পাবেন।

FastAPI এবং WebSocket ব্যবহার করে খুব সহজেই একটি রিয়েল-টাইম চ্যাট অ্যাপ্লিকেশন তৈরি করা যায়। এই অ্যাপ্লিকেশনটি multiple clients এর মধ্যে asynchronous ভাবে মেসেজ পাঠাতে এবং গ্রহণ করতে সক্ষম। FastAPI এর সাহায্যে আপনি দ্রুত এবং কার্যকরভাবে রিয়েল-টাইম যোগাযোগ সিস্টেম তৈরি করতে পারেন।

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...